package com.qkjia.filelock;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

/**
 * 文件锁演示
 */
public class FileLockDemo1 {

    public static void main(String[] args) throws Exception {
        String input = "qkjia";
        System.out.println("input:"+input);

        // 将字节数组包装到缓冲区中。
        ByteBuffer buffer = ByteBuffer.wrap(input.getBytes());

        String filePath = "e:\\qkjia\\01.txt";
        // Path 可用于在文件系统中定位文件的对象。 它通常表示系统相关文件路径。
        // Paths.get(filePath); 将路径字符串或连接形成路径字符串的字符串序列转换为Path
        Path path = Paths.get(filePath);

        // .open 打开或创建一个文件，返回一个文件通道来访问该文件。
        // StandardOpenOption.WRITE 打开以进行写访问。如果文件为WRITE访问而打开，则字节将写入文件的末尾而不是开头,StandardOpenOption.APPEND
        FileChannel channel =
                FileChannel.open(path,
                        StandardOpenOption.WRITE,StandardOpenOption.APPEND);
        // .position 设置此通道的文件位置。

            channel.position(channel.size()-1);


        // 加锁
        // NonReadableChannelException – 如果shared为true，则此通道未打开以供读取
//        FileLock lock = channel.lock(0L,Long.MAX_VALUE,true);
        FileLock lock = channel.lock(0L,Long.MAX_VALUE,false);
        // lock.isShared()告诉这个锁是否是共享的
        System.out.println("是否共享锁："+lock.isShared());

        channel.write(buffer);
        channel.close();

        //读文件
        readFile(filePath);
    }

    private static void readFile(String filePath) throws Exception {
        FileReader fileReader = new FileReader(filePath);
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        String tr = bufferedReader.readLine();
        System.out.println("读取出内容：");
        while(tr != null) {
            System.out.println(" "+tr);
            tr = bufferedReader.readLine();
        }
        fileReader.close();
        bufferedReader.close();
    }
}
